跳到主要内容

JZ44 翻转单词序列

https://www.nowcoder.com/practice/3194a4f4cf814f63919d0790578d51f3

第一次:

public class Solution {
public String ReverseSentence(String str) {
if (str.isEmpty()) return "";
String[] arr = str.split(" ");
// byte[] bytes = str.getBytes();
// 双指针交换
int low = 0;
int high = arr.length - 1;
while (high > low) {
String tmp = arr[high];
arr[high] = arr[low];
arr[low] = tmp;
low++;
high--;
}

StringBuilder result = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
if (i == arr.length - 1) {
result.append(arr[i]);
} else {
result.append(arr[i]).append(" ");
}
}

return result.toString();
}
}

第二次

第一次做只想着快速刷完,完全不考虑实际面试不能使用字符串方法的问题,其实这题思路和上一题一样,都是旋转字符串,大致思路就是先旋转整个句子,然后各个单词逐个旋转

public class Solution {
public String ReverseSentence(String str) {
if (str.isEmpty()) return "";
char[] strs = str.toCharArray();
// 先整个翻转一遍
reverse(strs, 0 , strs.length - 1);
// 使用双指针计算一个单词的位置
int low = 0;
int high = 1;
int len = strs.length;

while (high < len) {
boolean flag = high + 1 == len;
if (strs[high] == ' ' || flag) {
reverse(strs, low, flag ? high : high - 1);
high++;
low = high;
} else {
high++;
}
}

return new String(strs);
}

// 翻转字符串
private void reverse(char[] arr, int s, int e) {
int left = s;
int right = e;
while (left < right) {
char t = arr[left];
arr[left] = arr[right];
arr[right] = t;
left++;
right--;
}
}
}